19.6 控制结构与复杂度

文章目录
  1. 1. 复杂度的重要性
  2. 2. 如何衡量复杂度
    1. 2.1. 利用决策点(decision point)数量
    2. 2.2. 其他衡量手段
      1. 2.2.1. 智力实体数量
      2. 2.2.2. 所用的数据量
      3. 2.2.3. 控制结构中的嵌套层数
      4. 2.2.4. 代码行数
      5. 2.2.5. 同一变量的跨度
      6. 2.2.6. 变量的生存期
      7. 2.2.7. 输入和输出的量
    3. 2.3. 延伸

如果控制流不是影响复杂度的最大因素,那么至少也是最大的因素之一

复杂度的重要性

参考[[……]]

如何衡量复杂度

利用决策点(decision point)数量

最著名的方法,源自 Tom McCabe。又称[[圈复杂度]]

具体操作:

  • 计数从 1 开始,一直往下阅读程序
  • 一旦遇到如下关键字(或其他同性质的词),就加 1:
    • if、while、repeat、for、and、or
  • 对 case 语句中的每一种情况都加 1

对照下表:

子程序中的决策点数量 结论
1 ~ 5 子程序可能还不错,起码不复杂
6 ~ 10 得想办法简化子程序了
10 + 应该将这个子程序的某一部分改写为另一个子程序再调用它

关于上限:

10 个决策点的上限并不是绝对的(如 flask8 推荐上限是12 ),而是应该把决策点的数量当做警示。当警示出现时,就要仔细考虑子程序是否真的过于复杂、是否需要重新设计了

其他衡量手段

智力实体数量

为了理解应用程序,你必须在同一时间记住的智力实体的数量

所用的数据量

??

控制结构中的嵌套层数

toWrite

代码行数

toWrite

同一变量的跨度

toNote

变量的生存期

toNote

输入和输出的量

??

延伸

python 中的 flask8 可以用来衡量圈复杂度